#include <assert.h>
#include <ctype.h>
#include <locale.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void malloc_memory_allocate(void)
{
    printf("***** malloc_memory_allocate *****\n");
    char name[100];
    char *description;

    strcpy(name, "Dillon Leung");

    // Memory is allocated dynamically
    description = (char *)malloc( 200 * sizeof(char));
    if ( description == NULL )
    {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    }
    else
    {
        strcpy( description, "Zara ali a DPS student in class 10th");
    }
    printf("Name = %s\n", name );
    printf("Description: %s\n", description );
}

void  calloc_c_memory_allocte(void)
{
    printf("*****  calloc_c_memory_allocte *****\n");
    char name[100];
    char *description;

    strcpy(name, "Dillon Leung");

    // Memory is allocated dynamically
    description = (char *)calloc( 200 , sizeof(char));
    if ( description == NULL )
    {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    }
    else
    {
        strcpy( description, "Zara ali a DPS student in class 10th");
    }
    printf("Name = %s\n", name );
    printf("Description: %s\n", description );
}


void resize_and_release_memory(void)
{
    printf("***** resize_and_release_memory *****\n");
    char name[100];
    char *description;
    
    strcpy(name, "Zara Ali");
    
    /* 动态分配内存 */
    description = (char *)malloc( 30 * sizeof(char) );
    if( description == NULL )
    {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    }
    else
    {
        strcpy( description, "Zara ali a DPS student.");
    }
    /* 假设您想要存储更大的描述信息 */
    // 您可以尝试一下不重新分配额外的内存，strcat() 函数会生成一个错误，因为存储 description 时可用的内存不足。
    description = (char *) realloc( description, 100 * sizeof(char) );
    if( description == NULL )
    {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    }
    else
    {
        strcat( description, "She is in class 10th");
    }
    
    printf("Name = %s\n", name );
    printf("Description: %s\n", description );
    
    /* 使用 free() 函数释放内存 */
    free(description);
}


// 当动态分配内存时，您有完全控制权，可以传递任何大小的值。
// 而那些预先定义了大小的数组，一旦定义则无法改变大小。
void main(void)
{
    malloc_memory_allocate();
    calloc_c_memory_allocte();
    resize_and_release_memory();
    system("pause");
}

/*
C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到



函数和描述
void *calloc(int num, int size);
    在内存中动态地分配 num 个长度为 size 的连续空间，并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间，并且每个字节的值都是0。
void free(void *address);
    该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
void *malloc(int num);
    在堆区分配一块指定大小的内存空间，用来存放数据。这块内存空间在函数执行完成后不会被初始化，它们的值是未知的。
void *realloc(void *address, int newsize);
    该函数重新分配内存，把内存扩展到 newsize。


void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。

动态分配内存
    如果您预先知道数组的大小，那么定义数组时就比较容易
    我们需要定义一个指针，该指针指向未定义所需内存大小的字符，后续再根据需求来分配内存

当动态分配内存时，您有完全控制权，可以传递任何大小的值。
而那些预先定义了大小的数组，一旦定义则无法改变大小。



*/